package com.atguigu.config;

import com.atguigu.bean.Color;
import com.atguigu.bean.ColorFactoryBean;
import com.atguigu.bean.Person;
import com.atguigu.condition.LinuxCondition;
import com.atguigu.condition.MyImportBeanDefinitionRegistrar;
import com.atguigu.condition.MyImportSelector;
import com.atguigu.condition.WindowsCondition;
import org.springframework.context.annotation.*;

/**
 * @author Honglixi
 * @create 2021-03-26 14:55
 */
@Configuration
@Import({Color.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {
    /**
     *singleton 单实例(默认值)，ioc容器启动会调用方法创建对象放到ioc容器中，以后每次获取就是直接从容器中拿
     * prototype 多实例 ioc容器启动并不会去调用方法创建对象放在容器中，每次获取的时候才会调用方法去创建对象
     *
     * 懒加载 单实例bean：默认在容器启动的时候创建对象
     *        懒加载：容器启动不创建对象，第一次获取bean对象创建对象，并初始化
     *
     * @return
     */
    @Scope
    @Lazy
    @Bean("person")//容器中就会有一个person对象
    public Person person(){
        System.out.println("给容器中添加方法....");
        return new Person("Java",26);
    }
    /**
     * @Conditional 按照一定的条件进行判断，满足条件给容器中注册bean
     *
     */
    @Conditional({WindowsCondition.class})
    @Bean("bill")
    public Person person01(){
        return new Person("Bill Gates",66);
    }

    @Conditional(LinuxCondition.class)
    @Bean("honglixi")
    public Person person0(){
        return new Person("Honglixi",23);
    }

    /**
     * 给容器中注册组件；
     * 1）、包扫描+组件标注注解（@Controller/@Service/@Repository/@Component）[自己写的类]
     * 2）、@Bean[导入的第三方包里面的组件]
     * 3）、@Import[快速给容器中导入一个组件]
     * 		1）、@Import(要导入到容器中的组件)；容器中就会自动注册这个组件，id默认是全类名
     * 		2）、ImportSelector:返回需要导入的组件的全类名数组；
     * 		3）、ImportBeanDefinitionRegistrar:手动注册bean到容器中
     * 4）、使用Spring提供的 FactoryBean（工厂Bean）;
     * 		1）、默认获取到的是工厂bean调用getObject创建的对象
     * 		2）、要获取工厂Bean本身，我们需要给id前面加一个&
     * 			&colorFactoryBean
     */
    @Bean
    public ColorFactoryBean colorFactoryBean(){
        return new ColorFactoryBean();
    }
}
